package com.usj.dcalvo.ecommerce.action;

import java.net.MalformedURLException;
import java.net.URL;
import java.util.List;

import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;
import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;
import com.usj.dcalvo.clientews.ComprobacionesBancarias;
import com.usj.dcalvo.clientews.ComprobacionesBancariasService;
import com.usj.dcalvo.ecommerce.bean.ProductoBean;
import com.usj.dcalvo.ecommerce.bean.UsuarioBean;
import com.usj.dcalvo.ecommerce.manager.IProductoManager;
import com.usj.dcalvo.ecommerce.manager.IUsuarioManager;

public class PagoAction extends ActionSupport {

	private static final String INCORRECTO = "incorrecto";
	private static final String PAGO_OK = "pagook";
	private static final String DETALLE_PAGO = "detallePago";
	private static final long serialVersionUID = -3260738429746479196L;
	private static final Logger logger = Logger.getLogger(CarritoAction.class);
	private List<ProductoBean> listadoProductos;
	private IProductoManager productoManager;
	private IUsuarioManager usuarioManager;
	private String numeroCuenta;

	public String cargaPasarelaPago() {

		// Obtengo los productos que estan en la session
		logger.info("Viendo la lista de productos");
		obtenerProductosSession();
		return DETALLE_PAGO;
	}

	public String pagar() {
		String result;
		if (pagoCorrecto()) {
			logger.info("SE va a crear el registro de la venta en la BBDD");
			UsuarioBean usuarioSesion = obtenerUsuarioSession();
			UsuarioBean usuarioPorId = usuarioManager
					.getUsuarioPorId(usuarioSesion.getId());

			obtenerProductosSession();
			ProductoBean productoBeanDB;
			for (ProductoBean productoBean : listadoProductos) {
				productoBeanDB = productoManager.getProductoPorId(productoBean
						.getId());
				productoBeanDB.addUsuario(usuarioPorId);
				usuarioPorId.addProducto(productoBeanDB);
				productoManager.addVenta(productoBeanDB);
			}
			eliminarProductosSession();
			result = PAGO_OK;
		} else {
			logger.info("Viendo la lista de productos");
			obtenerProductosSession();
			addActionError("El numero de cuenta no es correcto");
			result = INCORRECTO;
		}
		return result;
	}

	private UsuarioBean obtenerUsuarioSession() {
		HttpSession session = ServletActionContext.getRequest().getSession();
		UsuarioBean attribute = (UsuarioBean) session.getAttribute("usuario");
		if (attribute != null) {
			logger.info("Llamo al DAO para recuperar los articulos");
			return attribute;
		}
		return null;
	}

	private void obtenerProductosSession() {
		HttpSession session = ServletActionContext.getRequest().getSession();
		List<Integer> attribute = ((List<Integer>) session
				.getAttribute("listaProductosSession"));
		if (attribute != null) {
			logger.info("Llamo al DAO para recuperar los articulos");
			listadoProductos = productoManager.getProductosPorIds(attribute);
		}
	}

	private void eliminarProductosSession() {
		HttpSession session = ServletActionContext.getRequest().getSession();
		session.removeAttribute("listaProductosSession");
		logger.info("Articulos eliminados del carrito");
	}

	private Boolean pagoCorrecto() {
		ComprobacionesBancariasService bancariasProxy;
		Boolean result = Boolean.FALSE;
		URL urlEndpint = null;
		if (getText("endpoint") != null && !"".equals(getText("endpoint"))) {
			try {
				urlEndpint = new URL(getText("endpoint"));
			} catch (MalformedURLException e) {
				e.printStackTrace();
			}
			bancariasProxy = new ComprobacionesBancariasService(urlEndpint);
		} else {
			bancariasProxy = new ComprobacionesBancariasService();
		}

		ComprobacionesBancarias comprobacionesBancarias = bancariasProxy
				.getComprobacionesBancariasPort();
		boolean tarjetaCreditoValida = comprobacionesBancarias
				.tarjetaCreditoValidad(numeroCuenta);
		if (tarjetaCreditoValida) {
			result = tarjetaCreditoValida;
		}
		return result;
	}

	public IProductoManager getProductoManager() {
		return productoManager;
	}

	public void setProductoManager(IProductoManager productoManager) {
		this.productoManager = productoManager;
	}

	public IUsuarioManager getUsuarioManager() {
		return usuarioManager;
	}

	public void setUsuarioManager(IUsuarioManager usuarioManager) {
		this.usuarioManager = usuarioManager;
	}

	public List<ProductoBean> getListadoProductos() {
		return listadoProductos;
	}

	public void setListadoProductos(List<ProductoBean> listadoProductos) {
		this.listadoProductos = listadoProductos;
	}

	public String getNumeroCuenta() {
		return numeroCuenta;
	}

	public void setNumeroCuenta(String numeroCuenta) {
		this.numeroCuenta = numeroCuenta;
	}

}
